package ch.ifage.business.service;


import java.io.Serializable;
import java.util.Date;
import java.util.List;
import ch.ifage.business.dom.Assureur;
import ch.ifage.business.dom.Client;
import ch.ifage.business.dom.Police;
import ch.ifage.business.dom.Sinistre;
import ch.ifage.business.helpers.jpa.Transactional;
import ch.ifage.business.interceptors.Secure;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Root;
import org.slf4j.Logger;
/**
 * Implementation du service, connectee a la base de donnee.
 * @author Betty Ba
 *
 */
@JPAImpl
@ApplicationScoped
public class ServiceCourtierJPAImpl implements ServiceCourtier, Serializable {
	 /** The logger for the class. */
	@Inject
    private transient Logger mLogger;
	/** serial ID */
	private static final long serialVersionUID = 1386508985359072399L;
	/** The entity manager that manages the persistence. */
    @PersistenceContext(unitName = "CourtagePersistence")
    @Inject
    private EntityManager mEntityManager;
    /** chapmps de recherche d un client. */
    private String mRechercheClient;
    /** chapmps de recherche d un assureur. */
    private String mRechercheAssureur;
    /** chapmps de recherche d une police. */
    private String mRecherchePolice;
    /** chapmps de recherche d un sinistre. */
    private String mRechercheSinistre;
    /** chapmps de recherche des polcies d un client selon son id. */
    private String mRecherchePolicesClientId;
    /** chapmps de recherche des polcies d un assureur selon son id. */
    private String mRecherchePolicesAssureurId;
    /** liste des polices d un client. */
    private List<Police> mPolicesDuClient;
    /** liste des polices d un assureur. */
    private List<Police> mPolicesAssureur;
    /** liste des sinistres d une police. */
    private List<Sinistre> mSinistresPolice;
    /** champs de saisie de modification de la raison sociale d un client. */
    private String mClientNouvelleRaisonSociale;
    /** champs de saisie de modification du domaine d activite d un client. */
    private String mClientNouveauDomaineActivite;
    /** champs de saisie de modification de l adresse d un client. */
    private String mClientNouvelleAdresse;
    /** champs de saisie de modification du nom de responsable d un client. */
    private String mClientNouveauResponsable;
    /** champs de saisie de modification du numero de telephone d un client. */
    private String mClientNouveauTelephone;
    /** champs de saisie de modification de l email d un client. */
    private String mClientNouvelEmail;
    /** champs de saisie de modification de la raison sociale d un assureur. */
    private String mAssureurNouvelleRaisonSociale;
    /** champs de saisie de modification de la adresse d un assureur. */
	private String mAssureurNouvelleAdresse;
	/** champs de saisie de modification du nom du responsable d un assureur. */
    private String mAssureurNouveauResponsable;
    /** champs de saisie de modification du numero de telephone d un assureur. */
    private String mAssureurNouveauTelephone;
    /** champs de saisie de modification de l email d un assureur. */
    private String mAssureurNouvelEmail;
    /** champs de saisie de modification du numero de police. */
    private String mPoliceNouveauNumero; 
    /** champs de saisie de modification de la date d entree d une police. */
    private Date mPoliceNouvelleDateDebut;
    /** champs de saisie de modification de la date d echeance d une police. */
    private Date mPoliceNouvelleDateFin;
    /** champs de saisie de modification de la prime. */
    private double mNouvellePrime;
    /** champs de saisie de modification du numero de sinistre. */
    private String mSinistreNouveauNumero;
    /** champs de saisie de modification du prenom d une personne sinistree. */
    private String mNouveauPrenom;
    /** champs de saisie de modification du nom d une personne sinistree. */
    private String mNouveauNom;
    /** champs de saisie de modification de la date de debut d un sinistre. */
    private Date mSinistreNouvelleDateDebut;
    /** champs de saisie de modification de la date de fin d un sinistre. */
    private Date mSinistreNouvelleDateFin;
    /** champs de saisie de modification d un indemnite. */
    private double mNouvelleIndemnite;
    
	/** Some post-construtor initializations. */
    @PostConstruct
    void init() {
        mLogger.info("Use the JPA implementation");
    }
    
    /** * @return tous les clients enregistres. */
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public List<Client> getTousLesClients() {
		 CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
	        CriteriaQuery<Client> c = qb.createQuery(Client.class);
	        TypedQuery<Client> query = mEntityManager.createQuery(c);
	        return query.getResultList();
	}
	/** * @return tous les assureurs enregistr�s. */
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public List<Assureur> getTousLesAssureurs() {
		 CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
	        CriteriaQuery<Assureur> c = qb.createQuery(Assureur.class);
	        TypedQuery<Assureur> query = mEntityManager.createQuery(c);
	        return query.getResultList();
	}
	/** * @return toutes les polices enregsitrees. */
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public List<Police> getToutesLesPolices() {
		 CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
	        CriteriaQuery<Police> c = qb.createQuery(Police.class);
	        TypedQuery<Police> query = mEntityManager.createQuery(c);
	        return query.getResultList();
	}
	/** * @return tous les sinistres enregistres. */
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public List<Sinistre> getTousLesSinistres() {
		CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
        CriteriaQuery<Sinistre> c = qb.createQuery(Sinistre.class);
        TypedQuery<Sinistre> query = mEntityManager.createQuery(c);
        return query.getResultList();
	}
	/** * @param client
	 *    ajout dans la base de donnees.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void ajouter(Client client) {
		 mEntityManager.persist(client);
		
	}
	/** * @param assureur
	 *    ajout dans la base de donnees.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void ajouter(Assureur assureur) {
		 mEntityManager.persist(assureur);
	}
	/** * @param police
	 *    ajout dans la base de donnees.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void ajouter(Police police) {
		 mEntityManager.persist(police);
		
	}
	/** * @param sinistre
	 *    ajout dans la base de donnees.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void ajouter(Sinistre sinistre) {
		 mEntityManager.persist(sinistre);
		
	}
	
	/** * @param client
	 *    suppression dans la base de donnees.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void supprimer(Client client) {
		
		client = (Client)mEntityManager.find(Client.class,client.getId());
	    mEntityManager.remove(client); 
		
	}
	/** * @param assureur
	 *    suppression dans la base de donnees.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void supprimer(Assureur assureur) {
		
		assureur = (Assureur)mEntityManager.find(Assureur.class,assureur.getId());
	    mEntityManager.remove(assureur); 
	}
	/** * @param police
	 *    suppression dans la base de donnees.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void supprimer(Police police) {
		
		police = (Police)mEntityManager.find(Police.class,police.getId());
	    mEntityManager.remove(police); 
		
	}
	/** * @param sinistre
	 *    suppression dans la base de donnees.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void supprimer(Sinistre sinistre) {
		
		sinistre = (Sinistre)mEntityManager.find(Sinistre.class,sinistre.getId());
	    mEntityManager.remove(sinistre); 
		
	}	
	/** * @return la raison sociale modifiee. */
    public String getClientNouvelleRaisonSociale() {
		return this.mClientNouvelleRaisonSociale;
	}
    /** * @param clientNouvelleRaisonSociale
	 *    valeur remplacant la raison sociale d un client.*/
    @Override
	public void setClientNouvelleRaisonSociale(String clientNouvelleRaisonSociale) {
		this.mClientNouvelleRaisonSociale = clientNouvelleRaisonSociale;
	}
    /** * @return le domaine d activite modifie. */
	public String getClientNouveauDomaineActivite() {
		return this.mClientNouveauDomaineActivite;
	}
	/** * @return la raison sociale modifiee. */
	@Override
	public void setClientNouveauDomaineActivite(String clientNouveauDomaineActivite) {
		this.mClientNouveauDomaineActivite = clientNouveauDomaineActivite;
	}
	/** * @param clientNouvelleAdresse
	 *    valeur remplacant l adresse d un client.*/
	@Override
	public void setClientNouvelleAdresse(String clientNouvelleAdresse) {
		this.mClientNouvelleAdresse = clientNouvelleAdresse;
	}
	/** * @return l adresse modifiee. */
	public String getClientNouvelleAdresse() {
		return this.mClientNouvelleAdresse;
	}
	/** * @param clientNouveauResponsable
	 *    valeur remplacant du nom du responsable d un client.*/
	@Override
	public void setClientNouveauResponsable(String clientNouveauResponsable) {
		this.mClientNouveauResponsable = clientNouveauResponsable;
	}
	/** * @return le nom du responsable d un client modifie. */
	public String getClientNouveauResponsable() {
		return this.mClientNouveauResponsable;
	}	
	/** * @param clientNouveauTelephone
	 *    valeur remplacant du numero de telephone d un client.*/
	@Override
	public void setClientNouveauTelephone(String clientNouveauTelephone) {
		this.mClientNouveauTelephone = clientNouveauTelephone;
	}
	/** * @return le numero de telephone d un client modifie. */
	public String getClientNouveauTelephone() {
		return this.mClientNouveauTelephone;
	}	
	/** * @param clientNouvelEmail
	 *    valeur remplacant de l email d un client.*/
	@Override
	public void setClientNouvelEmail(String clientNouvelEmail) {
		this.mClientNouvelEmail = clientNouvelEmail;
	}
	/** * @return l e mail d un client modifie. */
	public String getClientNouvelEmail() {
		return this.mClientNouvelEmail;
	}	
	/** * @return la raison sociale d un assureur modifiee. */
	public String getAssureurNouvelleRaisonSociale() {
		return this.mAssureurNouvelleRaisonSociale;
	}
	/** * @param assureurNouvelleRaisonSociale
	 *    valeur remplacant la raison sociale d un assureur.*/
	@Override
	public void setAssureurNouvelleRaisonSociale(String assureurNouvelleRaisonSociale) {
		this.mAssureurNouvelleRaisonSociale = assureurNouvelleRaisonSociale;
	}
	/** * @return l adresse d un assureur modifiee. */
	public String getAssureurNouvelleAdresse() {
		return this.mAssureurNouvelleAdresse;
	}
	/** * @param assureurNouvelleAdresse
	 *    valeur remplacant l adresse d un assureur.*/
	@Override
	public void setAssureurNouvelleAdresse(String assureurNouvelleAdresse) {
		this.mAssureurNouvelleAdresse = assureurNouvelleAdresse;
	}
	/** * @return le nom du responsable d un assureur modifie. */
	public String getAssureurNouveauResponsable() {
		return this.mAssureurNouveauResponsable;
	}
	/** * @param assureurNouveauResponsable
	 *    valeur remplacant le nom du responsable d un assureur.*/
	@Override
	public void setAssureurNouveauResponsable(String assureurNouveauResponsable) {
		this.mAssureurNouveauResponsable = assureurNouveauResponsable;
	}
	/** * @return le numero de telephone d un assureur modifie. */
	public String getAssureurNouveauTelephone() {
		return this.mAssureurNouveauTelephone;
	}
	/** * @return le numero de telephone d un assureur modifie. */
	@Override
	public void setAssureurNouveauTelephone(String mAssureurNouveauTelephone) {
		this.mAssureurNouveauTelephone = mAssureurNouveauTelephone;
	}
	/** * @return l email d un assureur modifie. */
	public String getAssureurNouvelEmail() {
		return this.mAssureurNouvelEmail;
	}
	/** * @param mAssureurNouvelEmail
	 *    valeur remplacant l email d un assureur.*/
	@Override
	public void setAssureurNouvelEmail(String mAssureurNouvelEmail) {
		this.mAssureurNouvelEmail = mAssureurNouvelEmail;
	}
	/** * @return le numero de police modifie. */
	public String getPoliceNouveauNumero() {
		return this.mPoliceNouveauNumero;
	}
	/** * @param policeNouveauNumero
	 *    valeur remplacant le numero de police.*/
	@Override
	public void setPoliceNouveauNumero(String policeNouveauNumero) {
		this.mPoliceNouveauNumero = policeNouveauNumero;
	}
	/** * @return la date d entree de police modifie. */
	public Date getPoliceNouvelleDateDebut() {
		return this.mPoliceNouvelleDateDebut;
	}
	/** * @param policeNouvelleDateDebut
	 *    valeur remplacant la date de debut de police.*/
	@Override
	public void setPoliceNouvelleDateDebut(Date policeNouvelleDateDebut) {
		this.mPoliceNouvelleDateDebut = policeNouvelleDateDebut;
	}
	/** * @return la date d echeance de police modifie. */
	public Date getPoliceNouvelleDateFin() {
		return this.mPoliceNouvelleDateFin;
	}
	/** * @param policeNouvelleDateFin
	 *    valeur remplacant la date de fin de police.*/
	@Override
	public void setPoliceNouvelleDateFin(Date policeNouvelleDateFin) {
		this.mPoliceNouvelleDateFin = policeNouvelleDateFin;
	}
	/** * @param nouvellePrime
	 *    valeur remplacant la prime.*/
	@Override
	public void setNouvellePrime(double nouvellePrime) {
		this.mNouvellePrime = nouvellePrime;
	}
	/** * @return la prime de police modifiee. */
	public double getNouvellePrime() {
		return this.mNouvellePrime;
	}
	/** * @return le numero de sinistre modifie. */
	public String getSinistreNouveauNumero() {
		return this.mSinistreNouveauNumero;
	}
	/** * @param sinistreNouveauNumero
	 *    valeur remplacant le numero de sinistre.*/
	@Override
	public void setSinistreNouveauNumero(String sinistreNouveauNumero) {
		this.mSinistreNouveauNumero = sinistreNouveauNumero;
	}
	/** * @return la date de debut du sinistre. */
	public Date getSinistreNouvelleDateDebut() {
		return this.mSinistreNouvelleDateDebut;
	}
	/** * @param sinistreNouvelleDateDebut
	 *    valeur remplacant la date de debut du sinistre.*/
	@Override
	public void setSinistreNouvelleDateDebut(Date sinistreNouvelleDateDebut) {
		this.mSinistreNouvelleDateDebut = sinistreNouvelleDateDebut;
	}
	/** * @return la date de fin du sinistre. */
	public Date getSinistreNouvelleDateFin() {
		return this.mSinistreNouvelleDateFin;
	}
	/** * @param sinistreNouvelleDateFin
	 *    valeur remplacant la date de fin du sinistre.*/
	@Override
	public void setSinistreNouvelleDateFin(Date sinistreNouvelleDateFin) {
		this.mSinistreNouvelleDateFin = sinistreNouvelleDateFin;
	}
	/** * @param nouvelleIndemnite
	 *    valeur remplacant la somme d indemnisation.*/
	@Override
	public void setNouvelleIndemnite(double nouvelleIndemnite) {
		this.mNouvelleIndemnite = nouvelleIndemnite;
	}
	/** * @return la somme d indemnisation modifiee. */
	public double getNouvelleIndemnite() {
		return this.mNouvelleIndemnite;
	}
	/** * @return le nom de la personne sinistree modifie. */
	public String getNouveauNom() {
		return this.mNouveauNom;
	}
	/** * @param nouveauNom
	 *    valeur remplacant le nom de la personnee sinistree.*/
	@Override
	public void setNouveauNom(String nouveauNom) {
		this.mNouveauNom = nouveauNom;
	}
	/** * @return le prenom de la personne sinistree modifie. */
	public String getNouveauPrenom() {
		return this.mNouveauPrenom;
	}
	/** * @param nouveauPrenom
	 *    valeur remplacant le prenom de la personnee sinistree.*/
	@Override
	public void setNouveauPrenom(String nouveauPrenom) {
		this.mNouveauPrenom = nouveauPrenom;
	}
	/** * @param client
	 *    modification des attributs du client.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void modifier(Client client) {		
		client = (Client)mEntityManager.find(Client.class,client.getId());
		client.setRaisonSociale(mClientNouvelleRaisonSociale);
		client.setDomaineActivite(mClientNouveauDomaineActivite);
		client.setResponsable(mClientNouveauResponsable);
		client.setAdresse(mClientNouvelleAdresse);
		client.setTelephone(mClientNouveauTelephone);
		client.setEmail(mClientNouvelEmail);		
	}
	/** * @param assureur
	 *    modification des attributs de l assureur.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void modifier(Assureur assureur) {		
		assureur = (Assureur)mEntityManager.find(Assureur.class,assureur.getId());
		assureur.setRaisonSociale(mAssureurNouvelleRaisonSociale);
		assureur.setResponsable(mAssureurNouveauResponsable);
		assureur.setAdresse(mAssureurNouvelleAdresse);
		assureur.setTelephone(mAssureurNouveauTelephone);
		assureur.setEmail(mAssureurNouvelEmail);		
	}
	/** * @param police
	 *    modification des attributs de la police.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void modifier(Police police) {		
		police = (Police)mEntityManager.find(Police.class,police.getId());
		police.setNumeroPolice(mPoliceNouveauNumero);
		police.setDateDebut(mPoliceNouvelleDateDebut);
		police.setDateFin(mPoliceNouvelleDateFin);
		police.setPrime(mNouvellePrime);
	}
	/** * @param sinistre
	 *    modification des attributs du sinistre.*/
	@Override
	@Transactional
    @Secure(roles = { "courtier" })
	public void modifier(Sinistre sinistre) {		
		sinistre = (Sinistre)mEntityManager.find(Sinistre.class,sinistre.getId());
		sinistre.setNumeroSinistre(mSinistreNouveauNumero);
		sinistre.setPrenom(mNouveauPrenom);
		sinistre.setNom(mNouveauNom);
		sinistre.setDateDebut(mSinistreNouvelleDateDebut);
		sinistre.setDateFin(mSinistreNouvelleDateFin);
		sinistre.setIndemnite(mNouvelleIndemnite);
	}	
	/** * @param client
	 *    ajoute dans une liste les polices d un client.*/
	@Override
	@Transactional
	@Secure(roles = { "courtier" })
	public void setPolicesDuClient(Client client) {
		if(client == null){
			this.mPolicesDuClient = this.getToutesLesPolices();
		}else{
		int id = client.getId();
        CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
        CriteriaQuery<Police> c = qb.createQuery(Police.class);
        Root<Police> po = c.from(Police.class);
        Join<Police, Client> p = po.join("mClient");
        c.select(po).where(qb.equal(p.get("mId"), id));
        TypedQuery<Police> query = mEntityManager.createQuery(c);
        this.mPolicesDuClient = query.getResultList();
		}
	}
	/** * @return a titre de demonstration retourne les polices d un client connecte. */
	@Override
	@Transactional
	public List <Police> getPolicesDuClientId() {						
			int id = 10;			
			if(this.mRecherchePolicesClientId == null){										
			CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
			CriteriaQuery<Police> c = qb.createQuery(Police.class);
			Root<Police> po = c.from(Police.class);
			Join<Police, Client> p = po.join("mClient");
			c.select(po).where(qb.equal(p.get("mId"), id));
			TypedQuery<Police> query = mEntityManager.createQuery(c);		
			return query.getResultList();
			}else{
				
			}
			CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
			CriteriaQuery<Police> c = qb.createQuery(Police.class);
		    Root<Police> from = c.from(Police.class);
		    c.where(qb.like(from.<String>get("mNumeroPolice"), "%"+mRecherchePolicesClientId+"%"));         		           
		    return mEntityManager.createQuery(c).getResultList();			
	}
	/** * @return a titre de demonstration retourne les polices d un assureur connecte. */
	@Override
	@Transactional
	public List <Police> getPolicesAssureurId() {						
			int id = 2;		
			if(this.mRecherchePolicesAssureurId == null){									
			CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
			CriteriaQuery<Police> c = qb.createQuery(Police.class);
			Root<Police> po = c.from(Police.class);
			Join<Police, Assureur> p = po.join("mAssureur");
			c.select(po).where(qb.equal(p.get("mId"), id));
			TypedQuery<Police> query = mEntityManager.createQuery(c);		
			return query.getResultList();
			}else{
				
			}
			CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
			CriteriaQuery<Police> c = qb.createQuery(Police.class);
		    Root<Police> from = c.from(Police.class);
		    c.where(qb.like(from.<String>get("mNumeroPolice"), "%"+mRecherchePolicesAssureurId+"%"));         		           
		    return mEntityManager.createQuery(c).getResultList();			
	}
	/** * @param 
	 *  a reinitialise le champs de recherche de polices d un client en le rendant null.*/
	 @Override 
	 public void annuleRecherchePolicesClientId(){
	    	this.mRecherchePolicesClientId = null;
	    	
	  }
	 /** * @param 
		 *  a reinitialise le champs de recherche de polices d un assureur en le rendant null.*/
	 @Override 
	 public void annuleRecherchePolicesAssureurId(){
	    	this.mRecherchePolicesAssureurId = null;
	    	
	 }
	
	 /** * @param client
		 *    ajoute dans une liste les polices d un assureur.*/
	@Override
	@Transactional
	public void setPolicesAssureur(Assureur assureur) {
		if(assureur == null){
			this.mPolicesAssureur = this.getToutesLesPolices();
		}else{
		int id = assureur.getId();
        CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
        CriteriaQuery<Police> c = qb.createQuery(Police.class);
        Root<Police> po = c.from(Police.class);
        Join<Police, Client> p = po.join("mAssureur");
        c.select(po).where(qb.equal(p.get("mId"), id));
        TypedQuery<Police> query = mEntityManager.createQuery(c);
        this.mPolicesAssureur = query.getResultList();
		}
	}
	/** * @return la liste des polices d'un client particulier. */
	@Override
	@Transactional
	public List<Police>getPolicesDuClient(){
		return this.mPolicesDuClient;	
	}
	
	/** * @return la liste des polices d'un client particulier. */
	@Override
	@Transactional
	public List<Police>getPolicesAssureur(){
		return this.mPolicesAssureur;
	}
	/** * @param rechercheClient
	 *    critere de recherche.*/
	public void setRechercheClient(String rechercheClient){
		this.mRechercheClient = rechercheClient;
	}
	/** * @return le critere de recherche. */
	public String getRechercheClient(){
		return this.mRechercheClient;
	}
	/** * @param rechercheAssureur
	 *    critere de recherche.*/
	public void setRechercheAssureur(String rechercheAssureur){
		this.mRechercheAssureur = rechercheAssureur;
	}
	/** * @return le critere de recherche. */
	public String getRechercheAssureur(){
		return this.mRechercheAssureur;
	}
	/** * @param recherchePolice
	 *    critere de recherche.*/
	public void setRecherchePolice(String recherchePolice){
		this.mRecherchePolice = recherchePolice;
	}
	/** * @return le critere de recherche. */
	public String getRecherchePolice(){
		return this.mRecherchePolice;
	}
	/** * @param recherchePolicesClientId
	 *    critere de recherche des polices d un client particulier.*/
	public void setRecherchePolicesClientId(String recherchePolicesClientId){
		this.mRecherchePolicesClientId = recherchePolicesClientId;
	}
	/** * @return le critere de recherche des polices d un client particulier. */
	public String getRecherchePolicesClientId(){
		return this.mRecherchePolicesClientId;
	}
	/** * @param recherchePolicesAssureurId
	 *    critere de recherche des polices d un assureur particulier.*/
	public void setRecherchePolicesAssureurId(String recherchePolicesAssureurId){
		this.mRecherchePolicesAssureurId = recherchePolicesAssureurId;
	}
	/** * @return le critere de recherche des polices d un assureur particulier. */
	public String getRecherchePolicesAssureurId(){
		return this.mRecherchePolicesAssureurId;
	}
	/** * @param recherchePolice
	 *    critere de recherche.*/
	public void setRechercheSinistre(String rechercheSinistre){
		this.mRechercheSinistre = rechercheSinistre;
	}
	/** * @return le critere de recherche. */
	public String getRechercheSinistre(){
		return this.mRechercheSinistre;
	}
	
	/** * @return la liste des clients correspondant au critere de recherche. */
	@Override
	@Transactional
	public List<Client>getClientsTrouves(){
		CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
        CriteriaQuery<Client> c = qb.createQuery(Client.class);
        Root<Client> from = c.from(Client.class);
        c.where(qb.like(from.<String>get("mRaisonSociale"), "%"+this.mRechercheClient+"%"));        
        if(this.mRechercheClient != null){      
        	return mEntityManager.createQuery(c).getResultList();
        }else{
        	return this.getTousLesClients();
        }     		
	}
	/** * @param 
	 *  reinitialise le champs de recherche d un client en le rendant null.*/
	@Override  
    public void annuleRechercheClient(){
    	this.mRechercheClient = null;
    	
    }
	/** * @return la liste des assureurs correspondant au critere de recherche. */
    @Override
	@Transactional
	public List<Assureur>getAssureursTrouves(){	
		CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
        CriteriaQuery<Assureur> c = qb.createQuery(Assureur.class);
        Root<Assureur> from = c.from(Assureur.class);
        c.where(qb.like(from.<String>get("mRaisonSociale"), "%"+this.mRechercheAssureur+"%"));        
        if(this.mRechercheAssureur != null){      
        	return mEntityManager.createQuery(c).getResultList();
        }else{
        	return this.getTousLesAssureurs();
        }     		
	}
    /** * @param 
	 *  reinitialise le champs de recherche d un assureur en le rendant null.*/
    @Override 
    public void annuleRechercheAssureur(){
    	this.mRechercheAssureur = null;
    	
    }
    /** * @return la liste des polices correspondant au critere de recherche. */
    @Override
	@Transactional
	public List<Police>getPolicesTrouvees(){
		
		CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
        CriteriaQuery<Police> c = qb.createQuery(Police.class);
        Root<Police> from = c.from(Police.class);
        c.where(qb.like(from.<String>get("mNumeroPolice"), "%"+this.mRecherchePolice+"%"));        
        if(this.mRecherchePolice != null){      
        	return mEntityManager.createQuery(c).getResultList();
        }else{
        	return this.getToutesLesPolices();
        }     		
	}
    
    /** * @param 
   	 *  reinitialise le champs de recherche d une police en le rendant null.*/
    @Override 
    public void annuleRecherchePolice(){
    	this.mRecherchePolice = null;
    	
    }
    /** * @return la liste des sinsitres correspondant au critere de recherche. */
    @Override
   	@Transactional
   	public List<Sinistre>getSinistresTrouves(){	
   		CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
        CriteriaQuery<Sinistre> c = qb.createQuery(Sinistre.class);
        Root<Sinistre> from = c.from(Sinistre.class);
        c.where(qb.like(from.<String>get("mNumeroSinistre"), "%"+this.mRechercheSinistre+"%"));        
        if(this.mRechercheSinistre != null){      
        return mEntityManager.createQuery(c).getResultList();
        }else{
        return this.getTousLesSinistres();
        }     		
   	}
    /** * @param 
   	 *  reinitialise le champs de recherche d un sinistre en le rendant null.*/
    @Override 
    public void annuleRechercheSinistre(){
    this.mRechercheSinistre = null;
       	
     }
     /** * @return ajoute dans une liste les sinsitres de la police selectionnee. */
    @Override 
   	@Transactional
   	public void setSinistresPolice (Police police){ 	
    	   int id = police.getId();
    	   CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
    	   CriteriaQuery<Sinistre> c = qb.createQuery(Sinistre.class);
    	   Root<Sinistre> po = c.from(Sinistre.class);
    	   Join<Sinistre, Police> p = po.join("mPolice");
    	   c.select(po).where(qb.equal(p.get("mId"), id));
    	   TypedQuery<Sinistre> query = mEntityManager.createQuery(c);
    	   this.mSinistresPolice = query.getResultList();
    }
    /** * @return la liste des sinsitres de la police selectionnee. */
	@Override
	public List<Sinistre> getSinistresPolice() {
		return this.mSinistresPolice;
	}   
	/** * @return la liste des sinsitres de la police selectionnee. */
	@Override 
	@Transactional
    public List <Sinistre> getSinistresPolice (Police police){
 	   int id = police.getId();
 	   CriteriaBuilder qb = mEntityManager.getCriteriaBuilder();
 	   CriteriaQuery<Sinistre> c = qb.createQuery(Sinistre.class);
 	   Root<Sinistre> po = c.from(Sinistre.class);
 	   Join<Sinistre, Police> p = po.join("mPolice");
 	   c.select(po).where(qb.equal(p.get("mId"), id));
 	   TypedQuery<Sinistre> query = mEntityManager.createQuery(c);
       return query.getResultList();
 	 }
    	      
}
